package com.tabnet.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.tabnet.beans.gammeproduit.PropositionGamme;
import com.tabnet.beans.personnes.Fournisseur;
import com.tabnet.beans.produit.Accessoire;
import com.tabnet.beans.produit.Categorie;
import com.tabnet.beans.produit.Option;
import com.tabnet.dao.DAOAccessoire;
import com.tabnet.dao.DAOCategorie;
import com.tabnet.dao.DAOException;
import com.tabnet.dao.DAOFactory;
import com.tabnet.dao.DAOOption;
import com.tabnet.dao.DAOPropositionGamme;
import com.tabnet.form.CreationPropositionForm;


/**
 * Servlet qui s'occupe de créer une proposition de gamme
 *
 */
public class CreationProposition extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	public static final String ATT_CAT        		= "categories";
	public static final String ATT_OPT        		= "options";
	public static final String ATT_ACC        		= "accessoires";
    public static final String ATT_PROP			  	= "proposition";
    public static final String ATT_FORM        		= "form";
    public static final String ATT_LES_PROPS		= "propositions";
	
    public static final String VUE_SUCCES      		= "/adminFourn/listeProposition.jsp";
    public static final String VUE_FORM        		= "/adminFourn/creerProposition.jsp";
    
    private DAOOption daoOption;
    private DAOAccessoire daoAccessoire;
    private DAOCategorie daoCategorie;
    private DAOPropositionGamme daoProp;
	
	public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
		HashMap<String, Categorie> lesCategories = null;
		HashMap<String, Option> lesOptions = null;
		Map<String, Accessoire> lesAccessoires = null;
		
		try {
			this.daoOption = DAOFactory.getInstance().getOptionDAO();
			this.daoAccessoire = DAOFactory.getInstance().getAccessoireDAO();
			this.daoCategorie = DAOFactory.getInstance().getCategorieDAO();
			
			// récupération des listes
	    	lesCategories = daoCategorie.listerCategorie();
	    	lesOptions = daoOption.listerOption();
			lesAccessoires = daoAccessoire.listerAccessoire();
			
		} catch (DAOException e1) {
			e1.printStackTrace();
		}
        request.setAttribute( ATT_CAT, lesCategories );
        request.setAttribute( ATT_OPT, lesOptions );
        request.setAttribute( ATT_ACC, lesAccessoires );

        /* À la réception d'une requête GET, simple affichage du formulaire */
        this.getServletContext().getRequestDispatcher( VUE_FORM ).forward( request, response );
    }

    @SuppressWarnings("unchecked")
	public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
    	try {
			this.daoProp = DAOFactory.getInstance().getPropositionGammeDAO();
		} catch (DAOException e1) {
			e1.printStackTrace();
		}
    	
    	//Préparation de l'objet formulaire 
    	CreationPropositionForm form = new CreationPropositionForm(daoProp, daoCategorie, daoOption, daoAccessoire);
        // Traitement de la requête et récupération du bean en résultant 
        PropositionGamme prop = null;
        
        HttpSession session = request.getSession();
        Fournisseur fourn = (Fournisseur) session.getAttribute("sessionFournisseur");
		try {
			prop = form.creerProposition( request, fourn );
		} catch (DAOException e) {
			e.printStackTrace();
		}
        
        // Ajout du bean et de l'objet métier à l'objet requête 
        request.setAttribute( ATT_FORM, form );
        request.setAttribute( ATT_PROP, prop );
        
        // Si aucune erreur 
        if ( form.getErreurs().isEmpty() ) {
        	session = request.getSession();
            HashMap<String, PropositionGamme> lesPropositions = (HashMap<String, PropositionGamme>) session.getAttribute( ATT_LES_PROPS );
            // Si aucune map n'existe, alors initialisation d'une nouvelle map 
            if ( lesPropositions == null ) {
            	lesPropositions = new HashMap<String, PropositionGamme>();
            }
            // Puis ajout du client courant dans la map 
            lesPropositions.put( prop.getRef(), prop );
            
            // Et enfin (ré)enregistrement de la map en session 
            session.setAttribute( ATT_LES_PROPS, lesPropositions );

            // Affichage de la fiche récapitulative 
            response.sendRedirect( request.getContextPath() + VUE_SUCCES );
        } else {
            // Sinon, ré-affichage du formulaire de création avec les erreurs 
            this.getServletContext().getRequestDispatcher( VUE_FORM ).forward( request, response );
        }
    }
}
